home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / RCS / brk.c,v < prev    next >
Text File  |  1991-12-03  |  6KB  |  321 lines

  1. head     1.7;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.7.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.7
  10. date     89.04.12.17.11.23;  author rab;  state Exp;
  11. branches 1.7.1.1;
  12. next     1.6;
  13.  
  14. 1.6
  15. date     88.07.25.14.52.28;  author ouster;  state Exp;
  16. branches ;
  17. next     1.5;
  18.  
  19. 1.5
  20. date     88.07.25.14.39.55;  author ouster;  state Exp;
  21. branches ;
  22. next     1.4;
  23.  
  24. 1.4
  25. date     88.07.25.14.23.36;  author ouster;  state Exp;
  26. branches ;
  27. next     1.3;
  28.  
  29. 1.3
  30. date     88.07.25.11.25.03;  author ouster;  state Exp;
  31. branches ;
  32. next     1.2;
  33.  
  34. 1.2
  35. date     88.06.18.15.33.28;  author ouster;  state Exp;
  36. branches ;
  37. next     1.1;
  38.  
  39. 1.1
  40. date     88.05.21.11.48.42;  author ouster;  state Exp;
  41. branches ;
  42. next     ;
  43.  
  44. 1.7.1.1
  45. date     91.12.02.22.08.18;  author kupfer;  state Exp;
  46. branches ;
  47. next     ;
  48.  
  49.  
  50. desc
  51. @@
  52.  
  53.  
  54. 1.7
  55. log
  56. @*** empty log message ***
  57. @
  58. text
  59. @/* 
  60.  * brk.c --
  61.  *
  62.  *    Source code for the "brk" and "sbrk" library procedures, which
  63.  *    emulate the UNIX kernel calls by the same names.
  64.  *
  65.  * Copyright 1985, 1988 Regents of the University of California
  66.  * Permission to use, copy, modify, and distribute this
  67.  * software and its documentation for any purpose and without
  68.  * fee is hereby granted, provided that the above copyright
  69.  * notice appear in all copies.  The University of California
  70.  * makes no representations about the suitability of this
  71.  * software for any purpose.  It is provided "as is" without
  72.  * express or implied warranty.
  73.  */
  74.  
  75. #ifndef lint
  76. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/brk.c,v 1.6 88/07/25 14:52:28 ouster Exp Locker: rab $ SPRITE (Berkeley)";
  77. #endif /* not lint */
  78.  
  79. #include <sprite.h>
  80. #include <stdio.h>
  81. #include <vm.h>
  82. #include <sys/types.h>
  83.  
  84. /*
  85.  * NextAddr is the user's idea of the location of the first
  86.  * as-yet-unallocated byte in the heap.  RealNextAddr is the
  87.  * real location.  We keep two pointers so we if a program
  88.  * asks brk() to reduce the size of the heap, we can shrink
  89.  * is without making any actual system calls.  The space is
  90.  * still allocated, so subsequent requests to extend the heap
  91.  * can also be met without system calls.
  92.  */
  93.  
  94. extern int end;                /* Linker gives this variable an
  95.                      * address equal to the location just
  96.                      * above the top of the heap. */
  97. #ifndef LINTLIB
  98. static caddr_t nextAddr = (caddr_t) &end;
  99. static caddr_t realNextAddr = (caddr_t) &end;
  100. #else
  101. static caddr_t nextAddr = 0;
  102. static caddr_t realNextAddr = 0;
  103. #endif /* LINTLIB */
  104. static int pageSize;
  105.  
  106. /*
  107.  * Macro to compute for any address, the first addresss of the page
  108.  * it is on.
  109.  */
  110.  
  111. #define FirstAddrOnPage(address)  (((int) (address)) & (~pageSize))
  112.  
  113.  
  114. /*
  115.  *----------------------------------------------------------------------
  116.  *
  117.  * brk --
  118.  *
  119.  *    Enlarge the heap, if necessary, so that it extends to at
  120.  *    least addr-1.
  121.  *
  122.  * Results:
  123.  *    0 is normally returned.  If the heap couldn't be extended
  124.  *    to the given place, then -1 is returned.
  125.  *
  126.  * Side effects:
  127.  *    The virtual address space of the process is extended.
  128.  *
  129.  *----------------------------------------------------------------------
  130.  */
  131.  
  132. caddr_t
  133. brk(addr)
  134.     caddr_t addr;        /* Make this the new "first location just
  135.                  * above top of heap".  */
  136. {
  137.     static int initialized = 0;
  138.     ReturnStatus status;
  139.  
  140.     if (!initialized) {
  141.         initialized = 1;
  142.  
  143.     /*
  144.      *  Get the system page size and calculate the address in the heap 
  145.      *  after the end of data to start allocating chunks from.
  146.      */
  147.  
  148.     if (Vm_PageSize(&pageSize) != SUCCESS) {
  149.         panic("brk couldn't get page size");
  150.         return 0;        /* should never get here */
  151.     }
  152.     pageSize -= 1;
  153.     }
  154.  
  155.     /*
  156.      * See if the new top-of-heap is already mapped;  if so, there's
  157.      * nothing for us to do.
  158.      */
  159.  
  160.     if (addr <= realNextAddr) {
  161.     nextAddr = addr;
  162.     return 0;
  163.     }
  164.     if(FirstAddrOnPage(realNextAddr - 1) != FirstAddrOnPage(addr)) {
  165.     status = Vm_CreateVA(realNextAddr, addr-realNextAddr);
  166.     if (status != SUCCESS) {
  167.         return (caddr_t) -1;
  168.     }
  169.     }
  170.     realNextAddr = nextAddr = addr;
  171.     return 0;
  172. }
  173.  
  174. /*
  175.  *----------------------------------------------------------------------
  176.  *
  177.  * sbrk --
  178.  *
  179.  *    Make "numBytes" more space available in the heap, and return
  180.  *    a pointer to it.
  181.  *
  182.  * Results:
  183.  *    The return value is a pointer to a new block of memory, which
  184.  *    is numBytes bytes long.  If no space could be allocated, then
  185.  *    -1 is returned.
  186.  *
  187.  * Side effects:
  188.  *    The virtual address space of the process is extended.
  189.  *
  190.  *----------------------------------------------------------------------
  191.  */
  192.  
  193. caddr_t
  194. sbrk(numBytes)
  195.     int numBytes;            /* Number of bytes desired.  */
  196. {
  197.     caddr_t result;
  198.  
  199.     result = nextAddr;
  200.     if (brk(nextAddr+numBytes) == (caddr_t) -1) {
  201.     return (caddr_t) -1;
  202.     }
  203.     return result;
  204. }
  205. @
  206.  
  207.  
  208. 1.7.1.1
  209. log
  210. @Initial branch for Sprite server.
  211. @
  212. text
  213. @d18 1
  214. a18 1
  215. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/brk.c,v 1.7 89/04/12 17:11:23 rab Exp $ SPRITE (Berkeley)";
  216. @
  217.  
  218.  
  219. 1.6
  220. log
  221. @Botched last lint cleanup.
  222. @
  223. text
  224. @d18 2
  225. a19 2
  226. static char rcsid[] = "$Header: brk.c,v 1.5 88/07/25 14:39:55 ouster Exp $ SPRITE (Berkeley)";
  227. #endif not lint
  228. d27 7
  229. a33 2
  230.  * NextAddr is the location of the first as-yet-unallocated byte in
  231.  * the heap.
  232. d41 1
  233. d44 2
  234. a45 1
  235. #endif LINTLIB
  236. d89 1
  237. a89 1
  238.     
  239. d102 2
  240. a103 1
  241.     if (addr <= nextAddr) {
  242. d106 2
  243. a107 2
  244.     if(FirstAddrOnPage(nextAddr - 1) != FirstAddrOnPage(addr)) {
  245.     status = Vm_CreateVA(nextAddr, addr-nextAddr);
  246. d112 1
  247. a112 2
  248.  
  249.     nextAddr = addr;
  250. @
  251.  
  252.  
  253. 1.5
  254. log
  255. @Generate cleaner lint library.
  256. @
  257. text
  258. @d18 1
  259. a18 1
  260. static char rcsid[] = "$Header: brk.c,v 1.4 88/07/25 14:23:36 ouster Exp $ SPRITE (Berkeley)";
  261. d85 1
  262. a85 1
  263.         return -1;        /* should never get here */
  264. @
  265.  
  266.  
  267. 1.4
  268. log
  269. @Lint.
  270. @
  271. text
  272. @d18 1
  273. a18 1
  274. static char rcsid[] = "$Header: brk.c,v 1.3 88/07/25 11:25:03 ouster Exp $ SPRITE (Berkeley)";
  275. d34 1
  276. d36 3
  277. @
  278.  
  279.  
  280. 1.3
  281. log
  282. @Lint.
  283. @
  284. text
  285. @d18 1
  286. a18 1
  287. static char rcsid[] = "$Header: brk.c,v 1.2 88/06/18 15:33:28 ouster Exp $ SPRITE (Berkeley)";
  288. d81 1
  289. a81 1
  290.         return;        /* should never get here */
  291. @
  292.  
  293.  
  294. 1.2
  295. log
  296. @Use panic instead of MemPanic.
  297. @
  298. text
  299. @d18 1
  300. a18 1
  301. static char rcsid[] = "$Header: brk.c,v 1.1 88/05/21 11:48:42 ouster Exp $ SPRITE (Berkeley)";
  302. d21 3
  303. a23 2
  304. #include "sprite.h"
  305. #include "vm.h"
  306. @
  307.  
  308.  
  309. 1.1
  310. log
  311. @Initial revision
  312. @
  313. text
  314. @d18 1
  315. a18 1
  316. static char rcsid[] = "$Header: MemChunkAlloc.c,v 1.1 88/05/20 15:49:12 ouster Exp $ SPRITE (Berkeley)";
  317. d79 1
  318. a79 1
  319.         MemPanic("Mem ChunkInit: failed to get page size");
  320. @
  321.